import base64
import hashlib
import rsa


def md5(content):
    """md5加密"""
    content = str(content)
    content_md5 = hashlib.md5(content.encode())
    return content_md5.hexdigest()


def base64_encode(content):
    """base64加密"""
    content = str(content).encode()
    value = base64.b64encode(content)
    value = value.decode()
    return value


def base64_decode(content):
    """base64加密"""
    content = str(content).encode()
    value = base64.b64decode(content)
    value = value.decode()
    return value


# # RSA
# # 生成公钥和私钥，密钥长度为 2048 位
# (pubkey, privkey) = rsa.newkeys(2048)
#
# # 保存公钥到文件
# with open('data/public.pem', 'wb') as f:
#     f.write(pubkey.save_pkcs1())
#
# # 保存私钥到文件
# with open('data/private.pem', 'wb') as f:
#     f.write(privkey.save_pkcs1())


def rsa_encode(plaintext):
    """
    使用 RSA 公钥对明文进行加密，并将加密结果进行 Base64 编码转换为字符串。

    :param plaintext: 待加密的明文内容，可以是字符串或其他可转换为字符串的类型。
    :return: 加密并经过 Base64 编码后的字符串。
    """
    try:
        # 将输入内容转换为字节类型
        plaintext_bytes = str(plaintext).encode()
        # 从文件加载公钥
        with open('data/public.pem', 'rb') as f:
            public_key = rsa.PublicKey.load_pkcs1(f.read())
        # 使用公钥进行加密
        encrypted_bytes = rsa.encrypt(plaintext_bytes, public_key)
        # 对加密后的字节数据进行 Base64 编码并转换为字符串
        encrypted_base64_str = base64.b64encode(encrypted_bytes).decode()
        return encrypted_base64_str
    except FileNotFoundError:
        print("错误：未找到公钥文件 'data/public.pem'。")
    except Exception as e:
        print(f"发生未知错误：{e}")
    return None


def rsa_decode(ciphertext):
    """
    对经过 Base64 编码的 RSA 密文进行解码，并使用私钥进行解密。

    :param ciphertext: 经过 Base64 编码的密文内容，为字符串类型。
    :return: 解密后的明文内容，为字符串类型。
    """
    try:
        # 将 Base64 编码的密文解码为字节类型
        ciphertext_bytes = base64.b64decode(ciphertext.encode())
        # 从文件加载私钥
        with open('data/private.pem', 'rb') as f:
            private_key = rsa.PrivateKey.load_pkcs1(f.read())
        # 使用私钥进行解密
        decrypted_bytes = rsa.decrypt(ciphertext_bytes, private_key)
        # 将解密后的字节数据转换为字符串
        decrypted_str = decrypted_bytes.decode()
        return decrypted_str
    except FileNotFoundError:
        print("错误：未找到私钥文件 'data/private.pem'。")
    except Exception as e:
        print(f"发生未知错误：{e}")
    return None
